# -*- coding: utf-8 -*-
#!/usr/bin/env python
"""
todo-version - Python Version
Author          : elalterno <elalterno@gmail.com>, Daniel Echeverry <epsilon77@gmail.com>
Modified by     : elalterno <elalterno@gmail.com>, Daniel Echeverry <epsilon77@gmail.com>
Concept by      : elalterno (elalterno@gmail.com)
License         : GPLv3, http://www.gnu.org/copyleft/gpl.html
More info       : http://code.google.com/p/todo-console/
Project Page    : http://code.google.com/p/todo-console/
Direct link     : http://todo-console.googlecode.com/svn/trunk/
Project todo.txt: http://misactividades.googlecode.com/svn/trunk/misactividades.txt
"""

__version__   = "0.1 beta"
__revision__  = "$Revision: 1 $"
__date__      = "2012/03/12"
__author__    = "elalterno (elalterno@gmail.com), Daniel Echeverry <epsilon77@gmail.com>"
__copyright__ = "Copyright 2012, elalterno, Daniel Echeverry <epsilon77@gmail.com>"
__license__   = "GPLv3"
__history__   = "See http://misactividades.googlecode.com/svn/trunk/CHANGELOG"

# Importamos las librerias necesarias
import sqlite3
import sys
import platform
import os
from time import *
import ConfigParser

cfg = ConfigParser.ConfigParser()

if cfg.read(["todo-console.cfg"]):
  if cfg.has_option("PARAMETROS", "db"):
    database = cfg.get("PARAMETROS", "db")
  else:
    print bcolors.FAIL + "No se encontro el parametro db" + bcolors.ENDC
    
  if cfg.has_option("PARAMETROS", "prompt"):
    promptV  = cfg.get("PARAMETROS", "prompt")
  else:
    print bcolors.FAIL + "No se encontro el parametro prompt" + bcolors.ENDC
else:
  cfg.add_section("PARAMETROS")
  cfg.set("PARAMETROS","db","dbtodo-console.s3db")
  cfg.set("PARAMETROS","prompt","todo-console>")
  cfg.set("PARAMETROS","salida","Gracias por usar todo-console!")
  f = open("todo-console.cfg","w")
  cfg.write(f)
  f.close()
  print bcolors.FAIL + "se generó el archivo de configuración"  + bcolors.ENDC


so = platform.system()
if so == 'Linux':
  BORRAR = 'clear'
else:
  BORRAR = 'cls'

# Creamos la conexion
connection = sqlite3.connect(database)

# Creamos el cursor
cursor = connection.cursor()

dic_orden = ['h', 'help','ls', 'list','a','add','q','quit','exit','clear','c','start','s']
dic_clase = ['actividad','-a','categoria','-c','subcategoria','-s','prioridad','-p','repeticion','-r','usuario','-u']
dic_filtro = ['order','-o','filtre','-f']
cadenabackup = []

#Definen colores
class bcolors:
    HEADER = '\033[95m'  # Morado
    OKBLUE = '\033[94m'  # Azul
    OKGREEN = '\033[92m' # Green
    WARNING = '\033[93m' # Naranja
    FAIL = '\033[91m'    # Rojo
    ENDC = '\033[0m'	 # Bblanco

    def disable(self):
        self.HEADER = ''
        self.OKBLUE = ''
        self.OKGREEN = ''
        self.WARNING = ''
        self.FAIL = ''
        self.ENDC = ''


#funcion validar_datos##########################
def validar_datos(cursor, tabla, id):
 if id == '':
  return 0 
 sql= 'select id from '+tabla+' where id='+id
 cursor.execute(sql)
 resultado_sql = cursor.fetchone()
 if resultado_sql == None:
    return 0
 else:
    return 1	
#################################################


def parsear(cadena):
  ordenes = cadena.split()
  orden = ordenes[0]
  ban_orden = 0
  for token in dic_orden:
    if orden == token:
      ban_orden = 1 
      if orden == 'help' or orden == 'h':
        help()
      if orden == 'list' or orden == 'ls':
        listar(ordenes[1:])
      if orden == 'add' or orden == 'a':
        adicionar(ordenes[1:])
      if (orden == 'quit' or orden == 'exit' or orden == 'q'):
        if len(ordenes) == 1:
          salir()
        else:
          cerror(-1)
      if orden == 'clear' or orden == 'c':
        if len(ordenes) == 1:
          limpiar()
        else:
          cerror(-1)

  if ban_orden == 0:
    cerror(0)
  return 1


#FUNCIONALIDAD LISTAR

def listar(ordenes):
  if len(ordenes) == 0:
    print bcolors.OKGREEN + 'listar actividades' + bcolors.ENDC
    listar2('-a','')
  else:
    ban_clase = 0
    clase = ordenes[0]
    if len(ordenes) == 2:
      parametros = ordenes[1]
    else:
      parametros = ''
    for token in dic_clase:
      if clase == token:
        ban_clase = 1
        if clase == 'actividad' or clase == '-a':
          print bcolors.OKGREEN + 'listar actividades' + bcolors.ENDC
          listar2('-a',parametros)
        if clase == 'categoria' or clase == '-c':
          print bcolors.OKGREEN + 'Categorias' + bcolors.ENDC
          listar2('-c','')
        if clase == 'subcategoria' or clase == '-s':
          print bcolors.OKGREEN + 'Subcategorias'+ bcolors.ENDC
          listar2('-s',parametros)
        if clase == 'prioridad' or clase == '-p':
          print bcolors.OKGREEN + 'Prioridades' + bcolors.ENDC
          listar2('-p','')
        if clase == 'repeticion' or clase == '-r':
          print bcolors.OKGREEN + 'listar repeticiones' + bcolors.ENDC
          listar2('-r','')
        if clase == 'usuario' or clase == '-u':
          print bcolors.OKGREEN + 'Usuarios' + bcolors.ENDC
          listar2('-u','')

    if ban_clase == 0:
        cerror(1)
  return 1

def listar2(clase,opciones):
  if clase == '-a':
    if opciones == '':
     sql = 'select a.id, a.descripcion, b.login, d.categoria, c.subcategoria, a.terminada \
           from ACTIVIDADES a  \
           join USUARIOS b on(  \
            a.usuario_id = b.id   \
            )\
            join SUBCATEGORIAS c on( \
             a.subcategoria_id = c.id   \
            )\
            join CATEGORIAS d on(  \
             c.categoria_id = d.id  \
            )'
    else:
      sql = 'select a.id, a.descripcion, b.login, c.subcategoria, a.terminada \
            from ACTIVIDADES a \
            join USUARIOS b on( \
              a.usuario_id = b.id \
            ) \
            join SUBCATEGORIAS c on( \
              a.subcategoria_id = c.id \
            ) \
            join CATEGORIAS d on(  \
              c.categoria_id = d.id  \
            )'	
    cursor.execute(sql)
    print bcolors.OKGREEN + '%4s %-40s %-10s %-20s %-10s %-2s' % ('ID','ACTIVIDAD','USUARIO','CATEGORIA','SUBCATEGORIA','E') +bcolors.ENDC
    for row in cursor:
      id = row[0]
      actividad = row[1]
      if len(actividad) >= 40:
          actividad = actividad[0:37] + '...'
      usuario = row[2]
      categoria = row[3]
      subcategoria = row[4]
      terminada = row[5]
      print bcolors.ENDC + '%4d %-40s %-10s %-20s %-12s %-2s' % (id,actividad,usuario[0:9],categoria[0:9],subcategoria[0:9],terminada[0:1]) + bcolors.ENDC + bcolors.ENDC

  if clase == '-c':
    sql = 'select * from CATEGORIAS '
    cursor.execute(sql)
    print bcolors.OKGREEN + '%4s %-30s %-40s' % ('ID','CATEGORIA','DESCRIPCION') + bcolors.ENDC
    for row in cursor:
      print bcolors.ENDC + '%4d %-30s %-40s' % (row[0],row[1],row[2]) + bcolors.ENDC
      
  if clase == '-s':
    if opciones == '':
      sql = 'select  a.id, a.subcategoria, a.descripcion, b.categoria \
            from subcategorias a, categorias b \
            where \
            a.categoria_id = b.id '
    else:
      sql = 'select  a.id, a.subcategoria, a.descripcion, b.categoria \
            from subcategorias a, categorias b \
            where \
            a.categoria_id = b.id and a.categoria_id = %s ' % (opciones)      
    cursor.execute(sql)
    print bcolors.OKGREEN + '%4s %-20s %-40s %-20s' % ('ID','SUBCATEGORIA','DESCRIPCION','CATEGORIA') + bcolors.ENDC
    for row in cursor:
      print bcolors.ENDC + '%4d %-20s %-40s %-20s' % (row[0],row[1],row[2],row[3]) + bcolors.ENDC
      
  if clase == '-r':
    sql = 'select * from REPETICIONES '
    cursor.execute(sql)
    print bcolors.OKGREEN + '%4s %-30s %-40s' % ('ID','REPETICION','DESCRIPCION') + bcolors.ENDC
    for row in cursor:
      print bcolors.ENDC + '%4d %-30s %-40s' % (row[0],row[1],row[2]) + bcolors.ENDC

  if clase == '-p':
    sql = 'select * from PRIORIDADES '
    cursor.execute(sql)
    print bcolors.OKGREEN + '%4s %-30s %-40s' % ('ID','PRIORIDAD','DESCRIPCION') + bcolors.ENDC
    for row in cursor:
      print bcolors.ENDC + '%4d %-30s %-40s' % (row[0],row[1],row[2]) + bcolors.ENDC
      
  if clase == '-u':
    sql = 'select id, login, nombres from USUARIOS '
    cursor.execute(sql)
    print bcolors.OKGREEN + '%4s %-30s %-40s' % ('ID','ALIAS','NOMBRE') + bcolors.ENDC
    for row in cursor:
      print bcolors.ENDC + '%4d %-30s %-40s' % (row[0],row[1],row[2]) + bcolors.ENDC

#FIN FUNCIONALIDAD LISTAR


#FUNCIONALIDAD ADICIONAR

def adicionar(ordenes):
  if len(ordenes) == 0:
    print bcolors.OKGREEN + 'adicionar actividad' + bcolors.ENDC
    adicionar2('-a','')
  else:
    ban_clase = 0
    clase = ordenes[0]
    for token in dic_clase:
      if clase == token:
        ban_clase = 1
        if clase == 'actividad' or clase == '-a':
          print bcolors.OKGREEN + 'adicionar actividad' + bcolors.ENDC
          adicionar2('-a','')
        if clase == 'categoria' or clase == '-c':
          print bcolors.OKGREEN + 'adicionar categoria' + bcolors.ENDC
          adicionar2('-c','')
        if clase == 'subcategoria' or clase == '-s':
          print bcolors.OKGREEN + 'adicionar subcategoria' + bcolors.ENDC
          adicionar2('-s','')
        if clase == 'prioridad' or clase == '-p':
          print bcolors.OKGREEN + 'adicionar prioridad' + bcolors.ENDC
          adicionar2('-p','')
        if clase == 'repeticion' or clase == '-r':
          print bcolors.OKGREEN + 'adicionar tipo de repeticion' + bcolors.ENDC
          adicionar2('-r','')
        if clase == 'usuario' or clase == '-u':
          print bcolors.OKGREEN + 'Usuarios' + bcolors.ENDC
          adicionar2('-u','')

    if ban_clase == 0:
        cerror(1)
  return 1

def adicionar2(clase,parametros):
  if clase == '-a':
    actividad = raw_input('Ingrese descripcion actividad -> ')
    listar2('-c','')
    categoria = raw_input('Ingrese id categoria -> ')
    listar2('-s',categoria)
    resultado = validar_datos(cursor, 'categorias', categoria)
    if resultado == 0:
	cerror(2)
        return 0
    subcategoria = raw_input('Ingrese id subcategoria -> ')
    resultado = validar_datos(cursor, 'subcategorias', subcategoria)
    if resultado == 0:
        cerror(3)
        return 0
    fecha = strftime('%Y-%m-%d %H:%M:%S')
    listar2('-u','')
    usuario = raw_input('Ingrese id usuario-> ')
    resultado = validar_datos(cursor, 'usuarios', usuario)
    if resultado == 0:
        cerror(4)
        return 0
    listar2('-p','')
    prioridad = raw_input('Ingrese id prioridad -> ')
    resultado = validar_datos(cursor, 'prioridades', prioridad)
    if resultado == 0:
        cerror(5)
        return 0
    listar2('-r','')
    repeticion = raw_input('Ingrese periocidad -> ')
    resultado = validar_datos(cursor, 'repeticiones', repeticion)
    if resultado == 0:
        cerror(6)
        return 0
    terminada = raw_input('Actividad terminada S/N)?  -> ')
    if terminada == 'S':
      fechaini = fecha
      fechafin = fecha
      tiempo = 0
    else:
      fechaini = ''
      fechafin = ''
      tiempo = 0
    sql = 'INSERT INTO ACTIVIDADES (descripcion, subcategoria_id,fecha,usuario_id,prioridad_id,repeticion_id,terminada, fechaini,fechafin,tiempo) VALUES(\'%s\' , \'%s\', \'%s\',\'%s\' , \'%s\', \'%s\',\'%s\' , \'%s\', \'%s\', \'%s\');' % (actividad,subcategoria,fecha, usuario, prioridad, repeticion, terminada, fechaini, fechafin, tiempo )
    cursor.execute(sql)
    # Hacemos efectiva la transaccion
    connection.commit()
    print bcolors.OKGREEN + 'Actividad adicionada!' + bcolors.ENDC

  if clase == '-c':
    categoria = raw_input('Ingrese nombre categoria -> ')
    descripcion = raw_input('Ingrese descripcion -> ')
    sql = 'INSERT INTO CATEGORIAS (categoria, descripcion) VALUES(\'%s\' , \'%s\');' % (categoria,descripcion )
    cursor.execute(sql)
    # Hacemos efectiva la transaccion
    connection.commit()
    print bcolors.OKGREEN + 'Categoria adicionada!' + bcolors.ENDC

  if clase == '-s':
    subcategoria = raw_input('Ingrese nombre subcategoria -> ')
    descripcion = raw_input('Ingrese descripcion -> ')
    listar2('-c','')
    categoria = raw_input('Ingrese id categoria -> ')
    sql = 'INSERT INTO SUBCATEGORIAS (subcategoria, descripcion, categoria_id) VALUES(\'%s\' , \'%s\', \'%s\');' % (subcategoria,descripcion, categoria)
    cursor.execute(sql)
    # Hacemos efectiva la transaccion
    connection.commit()
    print bcolors.OKGREEN + 'Subcategoria adicionada!' + bcolors.ENDC

  if clase == '-p':
    prioridad = raw_input('Ingrese nombre prioridad -> ')
    descripcion = raw_input('Ingrese descripcion -> ')
    sql = 'INSERT INTO PRIORIDADES (prioridad, descripcion) VALUES(\'%s\' , \'%s\');' % (prioridad,descripcion )
    cursor.execute(sql)
    # Hacemos efectiva la transaccion
    connection.commit()
    print bcolors.OKGREEN + 'Prioridad adicionada!'  + bcolors.ENDC

  if clase == '-r':
    repeticion = raw_input('Ingrese nombre repeticion -> ')
    descripcion = raw_input('Ingrese repeticion -> ')
    sql = 'INSERT INTO REPETICIONES (repeticion, descripcion) VALUES(\'%s\' , \'%s\');' % (repeticion,descripcion )
    cursor.execute(sql)
    # Hacemos efectiva la transaccion
    connection.commit()
    print bcolors.OKGREEN + 'Repeticion adicionada!' + bcolors.ENDC

  if clase == '-u':
    login = raw_input('Ingrese login del usuario -> ')
    nombres = raw_input('Ingrese nombres del usuario -> ')
    sql = 'INSERT INTO USUARIOS (login, nombres) VALUES(\'%s\' , \'%s\');' % (login, nombres )
    cursor.execute(sql)
    # Hacemos efectiva la transaccion
    connection.commit()
    print bcolors.OKGREEN + 'Usuario adicionado!' + bcolors.ENDC

#FIN FUNCIONALIDAD ADICIONAR

def cerror(e):
  if e == -1:
    print bcolors.FAIL + 'debe ingresar un comando valido' + bcolors.ENDC
  if e == 0:
    print bcolors.FAIL + 'debe ingresar un comando valido' + bcolors.ENDC
  if e == 1:
    print bcolors.FAIL + 'el comando no esta bien ingresado' + bcolors.ENDC
  if e == 2:
    print bcolors.FAIL + 'La categoria seleccionada no existe' + bcolors.ENDC
  if e == 3:
    print bcolors.FAIL + 'La subcategoria seleccionada no existe' + bcolors.ENDC
  if e == 4:
    print bcolors.FAIL + 'El usuario seleccionado no existe' + bcolors.ENDC
  if e == 5:
    print bcolors.FAIL + 'La prioridad seleccionada no existe' + bcolors.ENDC
  if e == 6:
    print bcolors.FAIL + 'La periocidad seleccionada no existe' + bcolors.ENDC

def help():
  print bcolors.OKGREEN + 'ayuda del programa' + bcolors.ENDC
  print 'Todo-Console V0.1'
  print ""
  print "Descripción"
  print 'Todo-console es una aplicación desarrollada en Python, \
        tiene como objetivo principal gestionar todas las actividades \
        del usuario. Su caracteristica más importante es la simplicidad\
        de la consola, desde una simple consola podra gestionar sus actividades, \
        creando categorias, prioridades, usuarios, periocidades.. entre otros.'
  print ""
  print "Comandos"
  print "add / add -a / add actividad -> Crear una nueva actividad "
  print "add -c / add categoria -> Crear una nueva categoria"
  print "add -s / add subcategoria -> Crear una nueva subcategoria"
  print "add -p / add prioridad -> Crear una nueva prioridad"
  print "add -r / add repeticiones -> Crear una nueva repeticion/periocidad"
  print ""
  print "ls / ls -a / ls actividad -> Lista las actividades"
  print "ls -c / ls categoria - > Lista las categorias"
  print "ls -s / ls subcategoria - > Lista las subcategorias disponibles"
  print "ls -p / ls prioridad - > Lista las prioridades"
  print "ls -r / ls repeticion - > Lista las repeticiones/periocidades"
  print ""
  print "Author"
  print "2012 elalterno <elalterno@gmail.com> "
  print "Daniel Echeverry <epsilon77@gmail.com>"
 
  
def salir():
  print bcolors.OKGREEN + 'Gracias por usar todo-console!' + bcolors.ENDC
  sys.exit(0)
  
def limpiar():
  #limpia la pantalla
  os.system(BORRAR)
  print bcolors.OKGREEN + 'todo-console v0.1' + bcolors.ENDC
  print bcolors.OKGREEN + 'teclea help o h por ayuda, q para salir.' + bcolors.ENDC

if __name__ == "__main__":

  cadena = ''
  limpiar()
  while True:
    
    cadena = raw_input(bcolors.OKGREEN + promptV + bcolors.ENDC)
    cadenabackup += [cadena]# guarda historial de comandos, falta adicionar funcionalidad
    parsear(cadena)
      
